"""
问题： 怎样从一个集合中获得最大或者最小的N个元素列表？
"""

# 解决方案：
# heapq模块有2个函数， nlargest()和nsmallest()可以完美解决这个问题

import heapq


def main():

    # heapq.nlargest(n, iterable, key)
    # users = [
    #     {'name': 'IBM1', 'age': 13, 'height': 50},
    #     {'name': 'IBM2', 'age': 16, 'height': 58},
    #     {'name': 'IBM3', 'age': 12, 'height': 47},
    #     {'name': 'IBM4', 'age': 11, 'height': 64},
    #     {'name': 'IBM5', 'age': 6, 'height': 49},
    # ]
    # print(heapq.nlargest(2, users, key=lambda user: user['height']))

    # 堆排序
    # nums = [1, 8, 2, 24, 7, -4, 18, 23, 42]
    # h = list(nums)
    # heapq.heapify(h)
    # print(h)
    # for i in range(3):
    #     print(heapq.heappop(h))

    nums = [1, 8, 2, 23, 7, -4, 18, 23, 42, 37, 2]
    print(heapq.nlargest(3, nums))
    print(heapq.nsmallest(3, nums))

    # 堆排序
    heapq.heapify(nums)


"""
注意： 
    当要查找的元素个数相对比较小的时候， 函数nlargest()和nsmallest()是很合适的
    如果仅仅是想查找唯一的最小或最大(N==1)的元素的话， 那么用min(), max()函数会更快些
    如果N的大小和集合大小接近的时候， 通常先排序这个集合， 再使用切片操作会更快点
        sorted(items)[:N]
"""


if __name__ == '__main__':
    main()
